package com.sheepone.util.algorithm.math;

import com.sheepone.util.algorithm.analysis.DoubleAnalysisUtil;

/**
 * @author Miss.杨
 * @description 数值积分工具类
 * @since 2024/3/6 - 21:22
 */

public class IntegralUtil {
    /**
     * 使用梯形法则计算一维数组表示的离散数据点的定积分.
     *一个是自变量值数组x，另一个是对应因变量值数组y。然后根据梯形法则逐个计算每个梯形的面积，并累加得到整个区间的积分结果。
     * 请注意，这个简单的版本没有处理精度控制或其他高级功能(无法处理连续函数)，它仅适用于离散数据点的积分。
     * @param x 自变量值的一维数组，必须是单调递增或递减
     * @param y 对应于x的因变量值的一维数组
     * @return 积分结果
     */
    public static double trapz(double[] x, double[] y) {
        if (x.length != y.length) {
            throw new IllegalArgumentException("The lengths of x and y must be equal.");
        }

        // 检查输入是否为单调序列
        if (!DoubleAnalysisUtil.isMonotonic(x)) {
            throw new IllegalArgumentException("The array x must be monotonic.");
        }

        double sum = 0.0;
        for (int i = 1; i < x.length; i++) {
            double width = x[i] - x[i - 1];
            double avgHeight = (y[i] + y[i - 1]) / 2.0;
            sum += width * avgHeight;
        }

        return sum;
    }


}

